<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>LRU算法</title>
  </head>
  <body>
    <h1>LRU</h1>
    <h3>什么是 LRU</h3>
    <p>
      LRU 全称是 Least Recently Used，意为 最近最少使用的
      ，是一种淘汰缓存策略，<br />
      目的是当内存中剩余的可用空间不足够是，缓存区尽可能优先保留
      用户最近时间内最常使用的数据
    </p>
    <h3>LRU 原理</h3>
    <p>
      如果一个数据在最近一段时间没有被访问到，那么在将来它被访问的可能性也很小。
      也就是说，当限定的空间已存满数据时，就把最久没有被访问到的数据淘汰。
    </p>
  </body>
  <script>
    class LRUCache {
      constructor(length) {
        this.length = length; // 存储长度
        this.data = new Map(); // 存储数据
      }
      // 存储数据，通过键值对的方式
      set(key, value) {
        // 获取 data
        const data = this.data;
        // 判断 data 是否有这条数据
        if (data.has(key)) {
          // 如果有就先删除
          data.delete(key);
        }
        // 再次将这条数据重新插入
        // 相当于更新了该条数据的最新位置
        data.set(key, value);

        // 如果超出了容量，需要删除最久为访问的数据
        if (data.size > this.length) {
          const delKey = data.keys().next().value;
          data.delete(delKey);
        }
      }
      get(key) {
        // 先拿到一条数据
        const data = this.data;
        // 如果未找到 返回 null
        // map.has 的返回值是一个布尔值，
        // 如果对象中存在指定键的元素返回 true ，否在返回 false
        // 可以不手动转换为 null
        if (!data.has(key)) {
          // return null;
          return;
        }
        const value = data.get(key); // 获取元素
        data.delete(key); // 删除元素
        data.set(key, value); // 重新插入元素
      }
    }

    const lrucache = new LRUCache(5);

    lrucache.set("张三", 18);
    lrucache.set("李四", 18);
    lrucache.set("王五", 18);
    lrucache.set("赵六", 18);
    lrucache.set("123", 18);
    console.log(lrucache);

    lrucache.set("王五", 18);
    lrucache.set("王八", 18);
    console.log(lrucache);

    lrucache.get("赵六");
    lrucache.get("李四");
    console.log(lrucache);
    1;
  </script>
</html>
